/**
 * Created by jams on 2016/4/4.
 */
(function (){
    //以双下划线“__”开头的函数为依赖编译环境的函数或常量

    var __undefined;//undefined代表
    var __zero=0;//数字代表
    var __string="";//字符串代表
    var __array=[];//数组代表
    var __object={};//对象代表
    var __date=new Date();//日期对象的代表
    var __regexp=/^(\*)$/;//正则表达式代表
    var __nop=function(){};//空函数代表
    var __keys=Object.keys;//取出对象中的所有属性名，拷贝一份
    var __is_array=Array.isArray;//判断一个对象是不是数组
    var __call=Object.call;

    //返为一个用来判断对象的类型是否与object相同的函数
    var __type=function(object){
        var type_string=typeof object + Object.call(object);
        return function (test){
            return type_string == typeof object + Object.call(test);
        }
    };
    var is_array=__type(__array);
    var is_object=__type(__object);
    var is_number=__type(__zero);
    var is_string=__type(__string);
    var is_function=__type(__nop);
    var is_undefined=__type(__undefined);
    var is_date=__type(__date);
    var is_regexp=__type(__regexp);
    /**
     * 检查一个函数是否是一元环
     * @param method
     * @returns {boolean}
     */
    var is_loop=function(method){
        return is_function(method) && method()==method;
    };

    var __self=function(){
        var args=arguments;

        return function (method){
            method(args);
        }
    };
    /**
     * 对输入参数的类型进行判断，并做出如下处理
     * 如果没有输入则返回一个空函数
     * 如果输入参数是数组，则对数组中的每一个元素执行同一个方法
     * 如果输入的参数是一个object对象，就对其每一个属性的键值执行同一个方法
     * 其它情况就把输入参数直接交给最终方法去处理
     * @param object_or_array
     * @returns {*}
     * @private
     */
    var __each=function(object_or_array){
        return is_array(object_or_array)?(object_or_array.forEach):function(){};
        if(is_undefined(object_or_array)){
            return __nop;
        }else if(is_array(object_or_array)){
            return function (method){
                object_or_array.forEach(method);
            }
        }else if(is_object(object_or_array)){
            return function (method){
                __keys(object_or_array).forEach(function(key){
                    method(key,object_or_array[key]);
                })
            }
        }else{
            return function (method){
                method();
            }
        }
    };

    //一元环，用于实现指令的空转
    var loop=function(){
        return loop;
    };

    //如果一个值存在就进入后文的函数，不存在，就进入空转状态
    var exist=function(test){
        if(test){
            return function (method){
                return method;
            }
        }
        return loop;
    };

    //具有存储能力的一个对象的保存与读取方法
    var store=function (storage){
        return exist(storage)(function(save,read){
            var _save=storage[save];
            var _read=storage[read];
            return exist(_save && _read)(function(key){
                return exist(key)(function(value){
                    if(value){
                        return _save(key,value);
                    }
                    return _read(key);
                });
            });
        });
    };

    var wear=function (obj){
        return function (src){
            __each(src)
        }
    };
    var rabbit=function(){

    };
    window.Rabbit=wear(rabbit)({
        self:__self
    });
}());
